//
// Created by LiuYou on 2021/10/28.
//

#include <iostream>
#include <unistd.h>
#include <fcntl.h>


static const int BUF_SIZE = 1024;

static int srcFd;
static int destFd;


int main(int argc, char** argv) {
    if (argc < 3) {
//        write( STDOUT_FILENO, "用法: %s filename" ,);
        fprintf( stderr, "用法: %s srcfile destfile\n", argv[0] );
        return 1;
    }


    srcFd = open( argv[1], O_RDONLY );
    if (srcFd < 0) {
        perror( "open()" );
        return 1;
    }
    atexit( [] {
        close( srcFd );
    } );

    // 在上一个版本中没有考虑到文件的权限, 这个版本中考虑了。
    // 如果是创建一个文件, 那么一定要给这个文件一个权限, 即使用3参的open();函数。
    destFd = open( argv[2], O_WRONLY | O_TRUNC | O_CREAT, 0666 );
    if (destFd < 0) {
        perror( "open()" );
        return 1;
    }
    atexit( [] {
        close( destFd );
    } );


    char buf[BUF_SIZE]{};
    while (true) {
        ssize_t readBytes = read( srcFd, buf, BUF_SIZE );
        if (readBytes < 0) {
            perror( "read()" );
            return 1;
        }
        if (readBytes == 0) {
            break;
        }

        // 必须考虑坚持写够 readBytes 个字节。

        ssize_t pos{};
        while (true) {
            ssize_t writeBytes = write( destFd, buf + pos, readBytes );
            if (writeBytes < 0) {
                perror( "write()" );
                return 1;
            }

            pos = pos + writeBytes;
            readBytes = readBytes - writeBytes;

            if (readBytes == 0) {
                break;
            }

        }


    }


    return 0;
}
